/*
 * Copyright 2013 University of Padua, Italy
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package it.dei.unipd.healthservice.database;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import it.dei.unipd.healthservice.resource.*;

/**
 * Crea un nuovo ordine per il fornitore
 * 
 * @author Giorgio Vitale
 * @version 1.00
 */
public class CreateOrdineFornitoreDatabase {
	/**
	 * Query di inserimento nuovo ordine fornitore nel database
	 */
	private static final String CREATE_ORDINE_FORNITURA = "INSERT INTO ordinefornitura(" +
									"idordinefornitura, dataordine, dataconsegna, piva, stato)" +
									"VALUES (?, ?, ?, ?, ?::stato_ordine);";
	
	private static final String CREATE_SINGOLA_VOCE_ORDINE = "INSERT INTO riguarda(" +
									"idmateriaprima, idordinefornitura, qta) VALUES (?, ?, ?);";
	
	/**
	 * Connessione al database
	 */
	private final Connection con;
	/**
	 * Ordine da creare
	 */
	private final OrdineFornitura ordine;
	/**
	 * Elementi che costituiscono l'ordine
	 */
	private final List<Riguarda> riguarda;
	/**
	 * Crea un nuovo ordine
	 * 
	 * @param con connessione al database.
	 * @param ordine ordine da creare
	 * @param riguarda elementi dell'ordine
	 */
	public CreateOrdineFornitoreDatabase(Connection con, OrdineFornitura ordine, List<Riguarda> riguarda) {
		this.con = con;
		this.ordine = ordine;
		this.riguarda = riguarda;
	}
	/**
	 * crea l'ordine
	 * 
	 * @throws SQLException
	 *             in caso di problemi nell'accesso al database.
	 */
	public void create() throws SQLException {
		PreparedStatement pstmt = null;
		ResultSet rs = null;

		try {
			//avvia transazione
			con.setAutoCommit(false);
			pstmt = con.prepareStatement(CREATE_ORDINE_FORNITURA);
			pstmt.setInt(1, ordine.getIdOrdineFornitura());
			pstmt.setDate(2, ordine.getDataOrdine());
			pstmt.setDate(3, ordine.getDataConsegna());
			pstmt.setString(4, ordine.getPiva());
			pstmt.setString(5, ordine.getStato().name());
			pstmt.executeUpdate();
			for (Riguarda r: riguarda){
				pstmt = con.prepareStatement(CREATE_SINGOLA_VOCE_ORDINE);
				pstmt.setInt(1, r.getIdMateriaPrima());
				pstmt.setInt(2, ordine.getIdOrdineFornitura());
				pstmt.setInt(3, r.getQuantita());
				pstmt.executeUpdate();
			}
			//invia tutti i dati in una volta
			con.commit();
		}
		catch (Exception e){
			//in caso di errore, annulla la transazione
			con.rollback();
			throw new SQLException(e.getMessage());
		}
		finally {
			if (con!=null)
				con.setAutoCommit(true);
			if (rs != null)
				rs.close();
			if (pstmt != null)
				pstmt.close();
			con.close();
		}
	}
}